/*
//步进电机转动
#include<reg52.h>
unsigned char code BeatCode[8]={
0x0E,0x0C,0x0D,0x09,0x0B,0x03,0x07,0x06
};
void Delay2ms();
void main()
{
    unsigned char tmp;//临时变量
    unsigned char index=0;//输出索引
    while(1)
    {
        tmp=P1;//暂存P1值 后续处理一下以便送回给P1
        tmp=tmp & 0xF0;//低四位清零
        tmp=tmp | BeatCode[index];//节拍写到低四位
        P1=tmp;//高四位原值 低四位节拍送回
        index++;
        // index=index & 0x07;//到8归零
        //相当于
        if(index>7)
        {
            index=0;
        }
        Delay2ms();// 2ms 一节拍
        }
    }

//延时2ms   最大频率 550Hz, ===1.8ms
void Delay2ms()		//@11.0592MHz
{
	unsigned char i, j;
	i = 4;
	j = 146;
	do
	{
		while (--j);
	} while (--i);
}
*/



/*
//步进电机角度理解   8*8拍
#include<reg52.h>

void TurnMotor(unsigned long angle); //形参  angle---需要转过的角度   电机转动函数

void Delay2ms();

void main()
{
    TurnMotor(360*2);//360度 2圈
    while(1);
    
}

//延时2ms   最大频率 550Hz, ===1.8ms
void Delay2ms()		//@11.0592MHz
{
	unsigned char i, j;
	i = 4;
	j = 146;
	do
	{
		while (--j);
	} while (--i);
}

//步进电机转动函数
void TurnMotor(unsigned long angle)
{
    unsigned char tmp;//临时变量
    unsigned char index=0;//输出索引
    unsigned long beats=0;//节拍总数
    //设为局部变量，节省内存
    unsigned char code BeatCode[8]={
        0x0E,0x0C,0x0D,0x09,0x0B,0x03,0x07,0x06
    };

    //8*8拍*减速比(1:64)=4096;---内部小齿轮64圈为外部输出一圈，结果为angle角度为多少拍
    beats=(angle*4096)/360;
    while(beats--)  //节拍不为0 不停下
    {
        tmp=P1;//暂存P1值 后续处理一下以便送回给P1
        tmp=tmp & 0xF0;//低四位清零
        tmp=tmp | BeatCode[index];//节拍写到低四位
        P1=tmp;//高四位原值 低四位节拍送回
        index++;
        index=index & 0x07;//到8归零
        //相当于
        // if(index>7)
        // {
        //     index=0;
        // }
        Delay2ms();// 2ms 一节拍
    }
    P1=P1 | 0x0F;//关闭电机所有相 节拍为零停下
 }
*/





//步进电机 减小误差 中断服务
#include<reg52.h>

void StarMotor(unsigned long angle); //形参  angle---需要转过的角度   电机转动函数

unsigned long beats=0;//节拍总数

void main()
{
    EA=1;
    TMOD=0x01;//定时器0
    TH0=0xF8;//2ms   X*12/11059200=0.002 X=1843 65536-1843=0xF8CD
    TL0=0xCD;
    TR0=1;//启动T0
    ET0=1;//使能T0中断
    StarMotor(360*2+180);//360度 2圈半
    while(1);
    
}

//步进电机启动函数
void StarMotor(unsigned long angle)
{
    //计算前关断 完成后打开，避免错误
    EA=0;
    beats=(angle*4076)/360;//实测为4076拍转一圈
    EA=1;  
}

 //T0中断服务
 void InterruptTimer0() interrupt 1
 {
    unsigned char tmp;//临时变量
    static unsigned char index=0;//节拍输出索引
    unsigned char code BeatCode[8]={
    0x0E,0x0C,0x0D,0x09,0x0B,0x03,0x07,0x06
};
    TH0=0xF8;//2ms   X*12/11059200=0.002 X=1843 65536-1843=0xF8CD
    TL0=0xCD;
    if(beats!=0)  //节拍不为0 产生驱动节拍
    {
        tmp=P1;//暂存P1值 后续处理一下以便送回给P1
        tmp=tmp & 0xF0;//低四位清零
        tmp=tmp | BeatCode[index];//节拍写到低四位
        P1=tmp;//高四位原值 低四位节拍送回
        index++;
        index=index & 0x07;//到8归零
        //相当于
        // if(index>7)
        // {
        //     index=0;
        // }
        beats--;// 节拍数-1
    }
    else
    {
         P1=P1 | 0x0F;//关闭电机所有相 节拍为零停下
    }
}

